-- card: 34332 from stack: in.5 -- bmap block id: 9472 -- flags: 0000 -- background id: 3858 -- name: FileSize ----- HyperTalk script ----- on HideObjects hide cd btn "Try It!" end HideObjects on ShowObjects show cd btn "Try It!" end ShowObjects -- part 2 (button) -- low flags: 00 -- high flags: A002 -- rect: left=82 top=185 right=219 bottom=175 -- title width / last selected line: 0 -- icon id / first selected line: 0 / 0 -- text alignment: 1 -- font id: 0 -- text size: 12 -- style flags: 8192 -- line height: 16 -- part name: Try it! ----- HyperTalk script ----- on mouseUp global errGlobal put FilePath("", "Choose a file please.") into fileName if fileName = empty then exit mouseUp put FileSize(fileName, "nodialog:errGlobal") into fSize if errGlobal ≠ empty then answer "Error: “" & errGlobal & "”" put empty into errGlobal else answer "“" & fileName & "” takes" && fSize && "bytes of valuable" && "disk space." end if end mouseUp -- part contents for background part 38 ----- text ----- 19/50 -- part contents for background part 20 ----- text ----- FileSize - An XFCN to return the size of a specified file FileSize(pathname, <"noDialog:"errorGlobal>) This XFCN will return the size of the file specified by the first parameter in BYTES not K. It currently can not return the size of a folder, but that will be fixed soon. -- part contents for background part 42 ----- text ----- { FileSize(pathname «,"nodialog":errGlobal») } { XFCN to return the creator for the file specified by } { the path given in the first parameter. } {} {} { Written by: Anup Murarka Eric Carlson } { ALINK: SKEPTIC ALINK: cyNic } { CIS: 76004,3356} {} { We are part of the Support Tools Development Group, } { Apple Computer, Inc. } {} { please DO NOT contack Mac DTS for support of this code! } {} { please DO contact the authors for support of this code! } {} { Send comments, bug reports, requests to any of the above } { E-mail addresses or to:} {} { (one of us) } { Apple Computer, Inc. } { 900 E. Hamilton, Ave. } { Campbell, CA 95008 } { M/S 72-L } {} { Copyright: © 1989, 1990 by Apple Computer, Inc., all rights reserved. } {} { written by : Anup Murarka } { AppleLink : Skeptic } { modification history } { Date Initials Comments } { ---- ------ -------------------------------------------------- } { 8/16/89 akm first written } { 5/21/90 ec removed upper case converion for A/UX compatibility. } { Changed version to 1.1 } {} unit FileSize; interface uses HyperXcmd; procedure MAIN (paramPtr: XCmdPtr); implementation procedure FileSize (paramPtr: XCmdPtr); FORWARD; procedure MAIN (paramPtr: XCmdPtr); begin FileSize(paramPtr); end; procedure reportToUser (paramPtr: XCmdPtr; msgStr: str255); {} { report something back to the user. } { the last parameter (optional) to an external may contain } { "noDialog" or "noDialog:GlobalName". GlobalName is the name } { of a HyperTalk global variable into which error messages will be } { placed. we've decided to use this approach to avoid confusing } { an error message with a valid result being returned from an XFCN. } {} var tempStr: str255; begin {check the last param to see if the user requested that} { we suppress the error dialog } ZeroToPas(paramPtr, paramPtr^.params[paramPtr^.paramCount]^, tempStr); UprString(tempStr, true); if pos('NODIALOG', tempStr) = 0 then { no special error handling specified, throw up a dialog and return the error message } begin SendCardMessage(paramPtr, concat('answer "', msgStr, '"')); paramPtr^.returnValue := PasToZero(paramPtr, msgStr); end else if (pos(':', tempStr) > 0) then { requested global AND noDialog so we fill in the global and return empty } begin tempStr := copy(tempStr, pos(':', tempStr) + 1, length(tempStr)); { get the name of the HC global to fill } SetGlobal(paramPtr, tempStr, PasToZero(paramPtr, msgStr)); { and fill it } paramPtr^.returnValue := PasToZero(paramPtr, ''); { return empty } end else { requested noDialog only so we return the error condition as the result } paramPtr^.returnValue := PasToZero(paramPtr, msgStr); end; { procedure } function AskedForHelp (paramPtr: XCmdPtr; syntaxMsg: Str255; copyrightMsg: Str255): boolean; { check to see if the user sent a '?' or a '!' as } { the only parameter. if so we will respond with } { the calling syntax or the copyright/version info } { for this external } {} var firstStr: str255; begin askedForHelp := false; if paramPtr^.paramCount = 1 then begin ZeroToPas(paramPtr, paramPtr^.params[1]^, firstStr); { what is the first param? } if firstStr = '?' then begin reportToUser(paramPtr, syntaxMsg); askedForHelp := true end { asked for help } else if firstStr = '!' then begin reportToUser(paramPtr, copyRightMsg); askedForHelp := true end; { asked for copyright info } end; { one parameter passed } end; { function } function LongToString (paramPtr: XCmdPtr; num: LONGINT): Str255; { why, oh why did dan write this one as a procedure??? } var tempStr: str255; begin LongToStr(paramPtr, num, tempStr); LongToString := tempStr; end; function NumberToString (paramPtr: XCmdPtr; num: LONGINT): Str255; { use the toolbox call rather than HC's } var tempStr: str255; begin NumToString(num, tempStr); NumberToString := tempStr; end; procedure reportResError (paramPtr: XCmdPtr; errorNum: integer); var errMsg, tempName: str255; begin case errorNum of { what caused the problem? } -0: errMsg := 'no error.'; -36: errMsg := 'I/O Error.'; -37: errMsg := 'bad file name or volume name.'; -38: errMsg := 'file not open.'; -39: errMsg := 'that file has no resource fork.'; -42: errMsg := 'too many files open.'; -43: errMsg := 'file not found.'; -45, -54, -61: errMsg := 'file locked.'; -47, -49: errMsg := 'file is busy.'; -53: errMsg := 'that volume is not on line.'; -108: errMsg := 'not enough room in heap zone.'; -120: errMsg := 'directory not found.'; -121: errMsg := 'too many working directories open.'; -127: errMsg := 'internal file system error.'; -192: errMsg := 'resource not found.'; -193: errMsg := 'file not found.'; otherwise errMsg := concat('unexpected error #', NumberToString(paramPtr, errorNum)); end; { case } errMsg := concat('Sorry, ', errMsg); reportToUser(paramPtr, errMsg); { return the error message } end; { function } function BitTest (AddressToCheck: ptr; TotalBits: integer; BitToTest: longint): boolean; { function that allows caller to use std. 68000 bit notation instead of the Toolbox's reversed notation} { example: bit 0 (the least significant bit) in a byte is bit 7 in the Toolbox's notation} begin BitTest := BitTst(AddressToCheck, TotalBits - 1 - BitToTest); end; function getParams (paramPtr: XCmdPtr; var PathToFile: str255): boolean; { function to get the parameters and validate them. Returns boolean} { instructing the main procedure to continue if the parameters passed} { are valid. Also returns syntax messages if requested by the user.} var numParams: integer; syntaxStr, copyrightStr: str255; begin getParams := true; {Initially, assume the parameters are valid.} syntaxStr := 'FileSize(pathname «, “nodialog”:errGlobal»)'; copyrightStr := '© 1989,1990 Apple Computer, Inc., v.1.1, by Anup Murarka'; {check that we have the proper number of parameters} numParams := paramPtr^.paramCount; if (numParams < 1) or (numParams > 2) then begin getParams := false; reportToUser(paramPtr, syntaxStr); exit(getParams); end; if AskedForHelp(paramPtr, syntaxStr, copyrightStr) then begin getParams := false; exit(getParams); end; { Get first parameter} ZeroToPas(paramPtr, paramPtr^.Params[1]^, PathToFile); end; {GetParams} procedure FileSize (paramPtr: XCmdPtr); var getParamsOK: boolean; FileName: str255; paramBlock: CInfoPBRec; vFileSize: longint; errorCode: OSerr; begin { filesize} { fetch and validate the passed parameters} getParamsOK := getParams(paramPtr, FileName); if not (getParamsOK) then exit(filesize); { Initialize the parameter block. Since we have the full pathname,} { no other field is really needed.} zeroBytes(paramPtr, @paramBlock, sizeOf(paramBlock)); paramBlock.ioNamePtr := @FileName; errorCode := PBGetCatInfo(@paramBlock, FALSE); if errorCode <> noErr then begin reportResError(paramPtr, errorCode); exit(filesize); end; { Is it a file or a directory?} if BitTest(@paramBlock.ioFlAttrib, 8, 4) then begin reportToUser(paramPtr, 'Sorry, I can not get the size of a directory (yet)!'); exit(FileSize); end; { Now prepare the return value. Use FileName as a temp variable} vFileSize := paramBlock.ioFlLgLen + paramBlock.ioFlRLgLen; FileName := LongToString(paramPtr, vFileSize); paramPtr^.returnValue := PasToZero(paramPtr, FileName); end; end.